package com.atguigu.edu.realtime.util;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import com.atguigu.edu.realtime.constant.EduConfig;

import java.sql.Connection;
import java.sql.SQLException;

public class DruidDSUtil {

        private static DruidDataSource druidDataSource;

        static {
            System.out.println("~~~获取Druid连接池对象~~~");
            // 创建连接池
            druidDataSource = new DruidDataSource();
            // 设置驱动全类名
            druidDataSource.setDriverClassName(EduConfig.PHOENIX_DRIVER);
            // 设置连接 url
            druidDataSource.setUrl(EduConfig.PHOENIX_URL);
            // 设置初始化连接池时池中连接的数量
            druidDataSource.setInitialSize(4);
            // 设置同时活跃的最大连接数
            druidDataSource.setMaxActive(8);
            // 设置空闲时的最小连接数，必须介于 0 和最大连接数之间，默认为 0
            druidDataSource.setMinIdle(2);
            // 设置没有空余连接时的等待时间，超时抛出异常，-1 表示一直等待
            druidDataSource.setMaxWait(-1);
            // 验证连接是否可用使用的 SQL 语句
            druidDataSource.setValidationQuery("select 1");
            // 指明连接是否被空闲连接回收器（如果有）进行检验，如果检测失败，则连接将被从池中去除
            // 注意，默认值为 true，如果没有设置 validationQuery，则报错
            // testWhileIdle is true, validationQuery not set
            druidDataSource.setTestWhileIdle(true);
            // 借出连接时，是否测试，设置为 false，不测试，否则很影响性能
            druidDataSource.setTestOnBorrow(true);
            // 归还连接时，是否测试
            druidDataSource.setTestOnReturn(false);
            // 设置空闲连接回收器每隔 30s 运行一次
            druidDataSource.setTimeBetweenEvictionRunsMillis(30 * 1000L);
            // 设置池中连接空闲 30min 被回收，默认值即为 30 min
            druidDataSource.setMinEvictableIdleTimeMillis(30 * 60 * 1000L);
        }

        public static Connection getConnection() throws SQLException {
            DruidPooledConnection conn = druidDataSource.getConnection();
            return conn;
        }
}
